/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestion;

import acceso.Administrador;
import acceso.Catalogo;
import acceso.Pago;
import acceso.Pedido;
import acceso.Producto;
import acceso.Proveedor;
import acceso.Venta;
import interfaz.InterfaceEjp;
import java.util.List;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.springframework.orm.hibernate3.HibernateTemplate;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
//import org.hibernate.Session;

public class GestionTransaccion extends HibernateDaoSupport implements InterfaceEjp {

    private final static Logger log = Logger.getLogger(GestionTransaccion.class);
    private HibernateTemplate temp;

    public GestionTransaccion() {
        BasicConfigurator.configure();
        Logger.getLogger("org.hibernate").setLevel(Level.WARN);

    }

    

    public Long registrarVenta(Venta venta) {
        this.logger.debug("Intentamos guardar la venta" + venta);
        temp = getHibernateTemplate();
        if (venta != null) {
            List listado = temp.find("FROM " + Venta.class.getName()
                    + " where venta_id =" + venta.getIdVenta());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(venta);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(venta);
            }
        }
        return venta.getIdVenta();

    }

    public void registrarVentaPersona(Long ventaid, Long productoid) {
        temp = getHibernateTemplate();
        Producto producto = (Producto) temp.find("FROM " + Producto.class.getName() + " where producto_id =" + productoid).get(0);
        Venta venta = (Venta) temp.find("FROM " + Venta.class.getName() + "  where venta_id =" + ventaid).get(0);
        producto.getVentas().add(venta);
        registrarProducto(producto);
    }

    public Long registrarProveedor(Proveedor proveedor) {
        this.logger.debug("Intentamos guardar el proveedor" + proveedor);
        temp = getHibernateTemplate();
        if (proveedor != null) {
            List listado = temp.find("FROM " + Proveedor.class.getName()
                    + " where proveedor_id =" + proveedor.getIdProveedor());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(proveedor);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(proveedor);
            }
        }
        return proveedor.getIdProveedor();

    }

    public Long registrarCatalogoProducto(Catalogo productoCatalogo) {
        this.logger.debug("Intentamos guardar la productoCatalogo" + productoCatalogo);
        temp = getHibernateTemplate();
        if (productoCatalogo != null) {
            List listado = temp.find("FROM " + Catalogo.class.getName()
                    + " where producto_id =" + productoCatalogo.getIdProducto());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(productoCatalogo);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(productoCatalogo);
            }
        }
        return productoCatalogo.getIdProducto();
    }

    public void registrarProductoProveedor(Long productoCatalogoId, Long proveedorId) {
        temp = getHibernateTemplate();
        Proveedor proveedor = (Proveedor) temp.find("FROM " + Proveedor.class.getName() + " where proveedor_id =" + productoCatalogoId).get(0);
        Catalogo productoCatalogo = (Catalogo) temp.find("FROM " + Catalogo.class.getName() + "  where producto_id =" + proveedorId).get(0);
        proveedor.getproductos().add(productoCatalogo);
        registrarProveedor(proveedor);
    }

    public Long registrarPedido(Pedido pedido) {
        this.logger.debug("Intentamos guardar el pedido" + pedido);
        temp = getHibernateTemplate();
        if (pedido != null) {
            List listado = temp.find("FROM " + Pedido.class.getName()
                    + " where pedido_id =" + pedido.getIdPedido());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(pedido);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(pedido);
            }
        }
        return pedido.getIdPedido();

    }

    public void registrarPedidoProveedor(Long pedidoId, Long productoId) {
        temp = getHibernateTemplate();
        Pedido pedido = (Pedido) temp.find("FROM " + Pedido.class.getName()
                      + " where pedido_id =" + pedidoId).get(0);
        Catalogo productoCatalogo = (Catalogo) temp.find("FROM "
                + Catalogo.class.getName() + "  where producto_id ="
                + productoId).get(0);

        pedido.getProductos().add(productoCatalogo);
        registrarPedido(pedido);
    }

    /**
     * Registra un nuevo administrador.
     *
     * @param  Administrador
     *         Objeto Administrador con todos los atributos seteados.
     * 
     * @return Long
     *         clave primaria del administrador que se a insertado.
     */

    public Long registrarAdmin(Administrador admin) {
        this.logger.debug("Intentamos guardar el admin" + admin);
        temp = getHibernateTemplate();
        if (admin != null) {
            List listado = temp.find("FROM " + Administrador.class.getName()
                    + " where administrador_id =" + admin.getIdAdministrador());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(admin);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(admin);
            }
        }
        return admin.getIdAdministrador();

    }

    /**
     * Compara el usuario y password introducido, el password va encriptado.
     *
     * @param  Usuario, Password
     *         Nombre de usuario y Password del administrador.
     *
     * @return boolean
     *         true o false segun el resultado de la comparacion.
     */


    public boolean compararLogin (String Usuario, String Password) {
        this.logger.debug("Buscamos el Administrador: "+Usuario);
        temp = getHibernateTemplate();
        List <Administrador> misAdmin = null;
        misAdmin = temp.find("FROM " +
        Administrador.class.getName() + " where nombreUsuario =" +"'"+Usuario+"'"
        + " and password ="+ "'"+ Password +"'");

        if (misAdmin.isEmpty())
        return false;
        else
        return true;
    }
    
     /**
     * Busca administradores por nombre y password.
     *
     * @param  Usuario, Password
     *         Nombre de usuario y Password del administrador.
     *
     * @return Administrador
     *         Objeto con la informacion del administrador.
     */

    public Administrador buscarAdminPorNombrePassword (String Usuario, String Password) {
        this.logger.debug("Buscamos el Administrador: "+Usuario);
        temp = getHibernateTemplate();
        Administrador miAdmin = (Administrador) temp.find("FROM " +
        Administrador.class.getName() + " where nombreUsuario =" +"'"+Usuario+"'"
        + " and password ="+ "'"+ Password +"'").get(0);

        return miAdmin;
    }

    /**
     * Registra un nuevo producto en el inventario.
     *
     * @param  Producto
     *         Objeto Producto con todos los atributos seteados.
     *
     * @return Long
     *         clave primaria del producto que se a insertado.
     */

    public Long registrarProducto(Producto producto) {
        this.logger.debug("Intentamos guardar el producto " + producto);
        temp = getHibernateTemplate();
        if (producto != null) {
            List listado = temp.find("FROM " + Producto.class.getName()
                    + " where producto_id =" + producto.getIdProducto());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(producto);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(producto);
            }
        }
        return producto.getIdProducto();

    }

    /**
     * Retorna todos los productos que se encuentran en el inventario.
     *
     * @return List <Producto>
     *         Retorna la lista de todos los productos almacenados en
     *         el inventario.
     */
    public List<Producto> MostrarProductos() {

        this.logger.debug("Buscamos todos los productos");
        temp = getHibernateTemplate();

        List<Producto> misProductos = temp.find("FROM " + Producto.class.getName());

        return misProductos;

    }

    /**
     * Eliminar un producto del inventario mediante su codigo de
     * indentificacion.
     *
     * @param Long
     *        clave primaria para efectuar la eliminacion del producto
     */


    public void EliminarProducto (Long id){

        this.logger.debug("Borramos el producto "+id);
        temp = getHibernateTemplate();
        Producto miProducto = (Producto) temp.load(Producto.class,id);
        temp.delete(miProducto);

    }

     /**
     * Retorna un producto del inventario mediante la busqueda por su
     * clave primaria.
     *
     * @param Long
     *        clave primaria para efectuar la busqueda del producto.
     *
     * @return Producto
     *         retorna un objeto del tipo Producto.
     */


    public Producto BuscarProducto (Long id) {
        this.logger.debug("Buscamos el Producto "+id);
        return (Producto) getHibernateTemplate()
        .get (Producto.class,id);
    }

     /**
     * Retorna una lista de productos del inventario mediante
     * la busqueda por su tipo (Papeleria o Limpieza).
     *
     * @param char
     *        tipo del producto (P = Papeleria, L = Limpieza)
     *
     * @return List <Producto>
     *         retorna una lista de productos filtrados a traves de su
     *         tipo.
     */


    public List <Producto> BuscarProductoPorTipo (char Tipo) {
        this.logger.debug("Buscamos el/los Producto(s) por: "+Tipo);
        temp = getHibernateTemplate();
        List <Producto> misProductosPorTipo = null;
        misProductosPorTipo = temp.find("FROM " + 
        Producto.class.getName() + " where tipo =" +"'"+Tipo+"'");

        if (misProductosPorTipo.isEmpty())
        return null;
        else
        return misProductosPorTipo;
    }


    /**
     * Retorna una lista de productos del inventario mediante la
     * busqueda por su Nombre.
     *
     * @param String
     *        Nombre del producto para efectuar su busqueda.
     *
     * @return List <Producto>
     *         retorna una lista de productos filtrado a traves de su
     *         nombre.
     */


    public List <Producto> BuscarProductoPorNombre (String Nombre) {
        this.logger.debug("Buscamos el/los Producto(s) por: "+Nombre);
        temp = getHibernateTemplate();
        List <Producto> misProductosPorNombre = temp.find("FROM " +
        Producto.class.getName() + " where nombre like" +"'"+Nombre+"%'" );

        if (misProductosPorNombre.isEmpty())
            return null;
        else
            return misProductosPorNombre;
    }


     /**
     * Retorna una lista de productos del inventario mediante la
     * busqueda por su clave primaria. Este metodo es generado para
     * cumplir con el metodo LlenarTablaProducto(List <Producto>) ubicado en
     * ui.PaginaPrincipal() ya que este recibe un tipo de dato List.
     *
     * @param Long
     *        clave primaria para efectuar la busqueda del producto.
     *
     * @return List <Producto>
     *         retorna en una lista el producto encontrado que contiene
     *         la clave primaria pasada como parametro.
     */

    public List <Producto> BuscarProductoPoriD (Long id) {
        this.logger.debug("Buscamos el Producto por: "+id);
        temp = getHibernateTemplate();
        List <Producto> misProductosPorId = temp.find("FROM " +
        Producto.class.getName() + " where producto_id =" +"'"+id+"'" );
        if (misProductosPorId.isEmpty())
        return null;
        else
        return misProductosPorId;
    }

 public List <Proveedor> BuscarProveedorPoriD (Long id) {
         System.out.println("id = " + id);
         this.logger.debug("Buscamos el Proveedor por: "+id);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedoresPorId = temp.find("FROM " +
        Proveedor.class.getName() + " where proveedor_id =" +"'"+id+"%'" );

        return misProveedoresPorId;
    }

          public List <Proveedor> BuscarProveedorPorIdTipo (char tipo,Long id) {
         this.logger.debug("Buscamos el Proveedor por: "+id+","+tipo);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedoresPorId = temp.find("FROM " +
        Proveedor.class.getName() + " where proveedor_id =" +"'"+id+"%' and tipo='"+tipo+"'" );

        return misProveedoresPorId;
    }

     public List <Proveedor> BuscarProveedorPorNombre (String Nombre) {
        this.logger.debug("Buscamos el/los Proveedor(s) por: "+Nombre);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedoresPorNombre = temp.find("FROM " +
        Proveedor.class.getName() + " where nombre like" +"'"+Nombre+"%'" );
        return misProveedoresPorNombre;
    }

  public List <Proveedor> BuscarProveedorPorNombreTipo (char tipo,String Nombre) {
        this.logger.debug("Buscamos el/los Proveedor(s) por: "+Nombre+","+tipo);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedoresPorNombretipo = temp.find("FROM " +
        Proveedor.class.getName() + " where nombre like" +"'"+Nombre+"%' and tipo='"+tipo+"'" );
        return misProveedoresPorNombretipo;
    }
public List <Proveedor> BuscarProveedorPorTipo (char Tipo) {
        this.logger.debug("Buscamos el/los Proveedor(s) por: "+Tipo);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedorPorTipo = temp.find("FROM " +

                Proveedor.class.getName() + " where tipo =" +"'"+Tipo+"'");

        return misProveedorPorTipo;
    }

public List <Proveedor> BuscarProveedorPorTipoCodigoNombre (char Tipo,Long codigo,String nombre) {
        this.logger.debug("Buscamos el/los Proveedor(s) por: "+Tipo+","+codigo+","+nombre);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedorPorTipoCodigoNombre = temp.find("FROM " +
                Proveedor.class.getName() + " where tipo =" +"'"+Tipo+"'"+
                " and proveedor_id='"+codigo
                +"' and nombre='"+nombre+"'");

        return misProveedorPorTipoCodigoNombre;
    }

public List <Proveedor> BuscarProveedorPorCodigoNombre (Long codigo,String nombre) {
        this.logger.debug("Buscamos el/los Proveedor(s) por: "+codigo+","+nombre);
        temp = getHibernateTemplate();
        List <Proveedor> misProveedorPorTipoCodigoNombre = temp.find("FROM " +
                Proveedor.class.getName() + " where proveedor_id='"+codigo
                +"' and nombre like'"+nombre+"%'");

        return misProveedorPorTipoCodigoNombre;
    }


    public void EliminarProveedor (Long id){

        this.logger.debug("Borramos el proveedor"+id);
        temp = getHibernateTemplate();
        Proveedor miProveedor = (Proveedor) temp.load(Proveedor.class,id);
        temp.delete(miProveedor);

    }


    public List<Proveedor> MostrarProveedores() {

        this.logger.debug("Buscamos todos los proveedores");
        temp = getHibernateTemplate();

        List<Proveedor> misProveedores = temp.find("FROM " + Proveedor.class.getName());

        return misProveedores;

    }

    public Proveedor BuscarProveedor (Long id) {
        this.logger.debug("Buscamos el Proveedor "+id);
        return (Proveedor) getHibernateTemplate().get(Proveedor.class, id);
    }

     /**
     * Registra un servicio      *
     * @param Pago
     *        Onjecto de tipo Pago, para realizar la inserción
     *
     * @return Long
     *         retorna el id del nuevo servicio.
     */
    public Long registrarPago(Pago pago) {
        this.logger.debug("Intentamos guardar el pago " + pago);
        temp = getHibernateTemplate();
        if (pago!= null) {
            List listado = temp.find("FROM " + Pago.class.getName()
                    + " where idpagos =" + pago.getIdPago());
            if (listado.isEmpty()) {
                this.logger.debug("No contiene, hacemos un save");
                temp.save(pago);
            } else {
                this.logger.debug("Contiene, hacemos un update");
                temp.update(pago);
            }
        }
        return pago.getIdPago();

    }

      /**
     * Retorna un servicio, busqueda por clave primaria.
     *
     * @param Long
     *        clave primaria para efectuar la busqueda del servicio.
     *
     * @return Pago
     *         retorna un objeto del tipo Pago.
     */

    public Pago BuscarPago (Long id) {
        this.logger.debug("Buscamos el Servicio "+id);
        return (Pago) getHibernateTemplate()
        .get (Pago.class,id);
    }

     /**
     * Eliminar un servicio por el codigo primario
     *
     *
     * @param Long
     *        clave primaria para efectuar la eliminacion del servicio
     */

    public void EliminarPago (Long id){
        this.logger.debug("Borramos el servicio "+id);
        temp = getHibernateTemplate();
        Pago miPago = (Pago) temp.load(Pago.class,id);
        temp.delete(miPago);

    }

    /**
     * Retorna los servicios que se encuentran registrados.
     *
     * @return List <Pagos>
     *         Retorna la lista de todos los servicios
     */

    public List<Pago> MostrarPagos() {

        this.logger.debug("Buscamos todos los servicios");
        temp = getHibernateTemplate();
        List<Pago> misPagos = temp.find("FROM " + Pago.class.getName());
        return misPagos;

    }

     /**
     * Retorna una lista de servicios con la
     * busqueda por  Nombre.
     *
     * @param String
     *        Nombre del servicio para efectuar su busqueda.
     *
     * @return List <Pago>
     *         retorna una lista de sercivios filtrado por el
     *         nombre.
     */



    public List <Pago> BuscarPagoPorNombre (String Nombre) {
        this.logger.debug("Buscamos Pago(s) por: "+Nombre);
        temp = getHibernateTemplate();
        List <Pago> misPagosPorNombre = temp.find("FROM " +
        Pago.class.getName() + " where nombre like" +"'"+Nombre+"%'" );
        return misPagosPorNombre;
    }

       /**
     * Retorna una lista de servicios del mediante la
     * busqueda por su clave primaria. Este metodo es generado para
     * cumplir con el metodo LlenarTablaPago(List <Pago>) ubicado en
     * ui.PaginaPrincipal() ya que este recibe un tipo de dato List.
     *
     * @param Long
     *        clave primaria para efectuar la busqueda del servicio.
     *
     * @return List <Pago>
     *         retorna en una lista el servicio encontrado que contiene
     *         la clave primaria pasada como parametro.
     */


    public List <Pago> BuscarPagoPoriD (Long id) {
        this.logger.debug("Buscamos el Pago por: "+id);
        temp = getHibernateTemplate();
        List <Pago> misPagosPorId = temp.find("FROM " +
        Pago.class.getName() + " where idpagos =" +"'"+id+"%'" );
        return misPagosPorId;


 }
}




